home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / game / shoot / ADoom_src_1_2.lha / ADoom_src / c2p_030.s < prev    next >
Text File  |  1998-03-01  |  11KB  |  459 lines

  1.         mc68020
  2.         section    text,code
  3.  
  4.         include    "exec/execbase.i"
  5.         include "exec/funcdef.i"
  6.         include    "exec/exec_lib.i"
  7.         include    "hardware/custom.i"
  8.  
  9. ; This routine based on Mikael Kalms' 030-optimised CPU3BLIT1
  10. ; Mikael Kalms' email address is kalms@vasa.gavle.se
  11. ;
  12. ; Simplified and changed to use Signal()s by Peter McGavin, 14 Jan 98
  13.  
  14.         xdef    _c2p1x1_cpu3blit1_queue_init
  15.         xdef    _c2p1x1_cpu3blit1_queue
  16.  
  17.         xref    _GfxBase
  18.  
  19. _LVOQBlit    equ    -276
  20.  
  21. ;-----------------------------------------------------------------------
  22. ;        IFND    CHUNKYXMAX
  23. ;CHUNKYXMAX    equ    320
  24. ;        ENDC
  25. ;        IFND    CHUNKYYMAX
  26. ;CHUNKYYMAX    equ    200
  27. ;        ENDC
  28.  
  29. ;-----------------------------------------------------------------------
  30. ; d0.w  chunkyx [chunky-pixels]
  31. ; d1.w  chunkyy [chunky-pixels]
  32. ; d3.w  scroffsy [screen-pixels]
  33. ; d5.l  bplsize [bytes] -- offset between one row in one bpl and the next bpl
  34. ; d6.l  signals1 mask
  35. ; d7.l  signals3 mask
  36. ; a2.l  this task to Signal(signals1) on cleanup
  37. ; a3.l  other task to Signal(signals3) on cleanup
  38. ; a4.l  chip buffer of at least size chunkyx * chunkyy
  39.  
  40. _c2p1x1_cpu3blit1_queue_init
  41.         movem.l    d2-d3,-(sp)
  42.         lea    (c2p_data,pc),a0
  43.         move.l    a4,(c2p_blitbuf-c2p_data,a0)
  44.         move.l    d6,(signals1-c2p_data,a0)
  45.         move.l    d7,(signals3-c2p_data,a0)
  46.         move.l    a2,(task-c2p_data,a0)
  47.         move.l    a3,(othertask-c2p_data,a0)
  48.         andi.l    #$ffff,d0
  49.         andi.l    #$ffff,d2
  50.         move.l    d5,(c2p_bplsize-c2p_data,a0)
  51.         move.w    d1,(c2p_chunkyy-c2p_data,a0)
  52.         add.w    d3,d1
  53.         mulu.w    d0,d1
  54.         lsr.l    #3,d1
  55.         subq.l    #2,d1
  56.         move.l    d1,(c2p_scroffs2-c2p_data,a0)
  57.         mulu.w    d0,d3
  58.         lsr.l    #3,d3
  59.         move.l    d3,(c2p_scroffs-c2p_data,a0)
  60.         move.w    (c2p_chunkyy-c2p_data,a0),d1
  61.         mulu.w    d0,d1
  62.         move.l    d1,(c2p_pixels-c2p_data,a0)
  63.         lsr.l    #4,d1
  64.         move.l    d1,(c2p_pixels16-c2p_data,a0)
  65.         movem.l    (sp)+,d2-d3
  66.         rts
  67.  
  68. ;-----------------------------------------------------------------------
  69. ; a0    c2pscreen
  70. ; a1    bitplanes
  71.  
  72. _c2p1x1_cpu3blit1_queue
  73.         movem.l    d2-d7/a2-a6,-(sp)
  74.  
  75.         lea    (c2p_data,pc),a2
  76.         move.l    a1,(c2p_screen-c2p_data,a2)
  77.  
  78.         move.l    #$0f0f0f0f,a4
  79.         move.l    #$00ff00ff,a5
  80.         move.l    #$55555555,a6
  81.  
  82.         movea.l    (c2p_blitbuf-c2p_data,a2),a1
  83.         move.l    (c2p_pixels-c2p_data,a2),a2
  84.         add.l    a0,a2
  85.         cmpa.l    a0,a2
  86.         beq    .none
  87.  
  88.         move.l    (a0)+,d0
  89.         move.l    (a0)+,d6
  90.         move.l    (a0)+,a3
  91.         move.l    (a0)+,d7
  92.         move.l    a4,d5
  93.         move.l    d6,d1            ; Swap 4x1
  94.         lsr.l    #4,d1
  95.         eor.l    d0,d1
  96.         and.l    d5,d1
  97.         eor.l    d1,d0
  98.         lsl.l    #4,d1
  99.         eor.l    d6,d1
  100.  
  101.         move.l    a3,d6
  102.         move.l    d7,d4
  103.         lsr.l    #4,d4
  104.         eor.l    d6,d4
  105.         and.l    d5,d4
  106.         eor.l    d4,d6
  107.         lsl.l    #4,d4
  108.         eor.l    d4,d7
  109.  
  110.         move.l    a5,d5
  111.         move.l    d6,d2            ; Swap 8x2, part 1
  112.         lsr.l    #8,d2
  113.         eor.l    d0,d2
  114.         and.l    d5,d2
  115.         eor.l    d2,d0
  116.         lsl.l    #8,d2
  117.         eor.l    d6,d2
  118.  
  119.         bra.b    .start
  120. .x
  121.         move.l    (a0)+,d0
  122.         move.l    (a0)+,d6
  123.         move.l    (a0)+,a3
  124.         move.l    (a0)+,d7
  125.         move.l    d1,(a1)+
  126.         move.l    a4,d5
  127.         move.l    d6,d1            ; Swap 4x1
  128.         lsr.l    #4,d1
  129.         eor.l    d0,d1
  130.         and.l    d5,d1
  131.         eor.l    d1,d0
  132.         lsl.l    #4,d1
  133.         eor.l    d6,d1
  134.  
  135.         move.l    a3,d6
  136.         move.l    d7,d4
  137.         lsr.l    #4,d4
  138.         move.l    d2,(a1)+
  139.         eor.l    d6,d4
  140.         and.l    d5,d4
  141.         eor.l    d4,d6
  142.         lsl.l    #4,d4
  143.         eor.l    d4,d7
  144.  
  145.         move.l    a5,d5
  146.         move.l    d6,d2            ; Swap 8x2, part 1
  147.         lsr.l    #8,d2
  148.         eor.l    d0,d2
  149.         and.l    d5,d2
  150.         eor.l    d2,d0
  151.         move.l    d3,(a1)+
  152.         lsl.l    #8,d2
  153.         eor.l    d6,d2
  154. .start
  155.         move.l    a6,d4
  156.         move.l    d2,d3            ; Swap 1x2, part 1
  157.         lsr.l    #1,d3
  158.         eor.l    d0,d3
  159.         and.l    d4,d3
  160.         eor.l    d3,d0
  161.         add.l    d3,d3
  162.         eor.l    d3,d2
  163.  
  164.         move.l    d7,d3            ; Swap 8x2, part 2
  165.         lsr.l    #8,d3
  166.         move.l    d0,(a1)+
  167.         eor.l    d1,d3
  168.         and.l    d5,d3
  169.         eor.l    d3,d1
  170.         lsl.l    #8,d3
  171.         eor.l    d7,d3
  172.  
  173.         move.l    d3,d6            ; Swap 1x2, part 2
  174.         lsr.l    #1,d6
  175.         eor.l    d1,d6
  176.         and.l    d4,d6
  177.         eor.l    d6,d1
  178.         add.l    d6,d6
  179.         eor.l    d6,d3
  180.  
  181.         move.l    (a0)+,d0
  182.         move.l    (a0)+,d6
  183.         move.l    (a0)+,a3
  184.         move.l    (a0)+,d7
  185.         move.l    d1,(a1)+
  186.         move.l    a4,d5
  187.         move.l    d6,d1            ; Swap 4x1
  188.         lsr.l    #4,d1
  189.         eor.l    d0,d1
  190.         and.l    d5,d1
  191.         eor.l    d1,d0
  192.         lsl.l    #4,d1
  193.         eor.l    d6,d1
  194.  
  195.         move.l    a3,d6
  196.         move.l    d7,d4
  197.         lsr.l    #4,d4
  198.         move.l    d2,(a1)+
  199.         eor.l    d6,d4
  200.         and.l    d5,d4
  201.         eor.l    d4,d6
  202.         lsl.l    #4,d4
  203.         eor.l    d4,d7
  204.  
  205.         move.l    a5,d5
  206.         move.l    d6,d2            ; Swap 8x2, part 1
  207.         lsr.l    #8,d2
  208.         eor.l    d0,d2
  209.         and.l    d5,d2
  210.         eor.l    d2,d0
  211.         move.l    d3,(a1)+
  212.         lsl.l    #8,d2
  213.         eor.l    d6,d2
  214.  
  215.         move.l    a6,d4
  216.         move.l    d2,d3            ; Swap 1x2, part 1
  217.         lsr.l    #1,d3
  218.         eor.l    d0,d3
  219.         and.l    d4,d3
  220.         eor.l    d3,d0
  221.         add.l    d3,d3
  222.         eor.l    d3,d2
  223.  
  224.         move.l    d7,d3            ; Swap 8x2, part 2
  225.         lsr.l    #8,d3
  226.         move.l    d0,(a1)+
  227.         eor.l    d1,d3
  228.         and.l    d5,d3
  229.         eor.l    d3,d1
  230.         lsl.l    #8,d3
  231.         eor.l    d7,d3
  232.  
  233.         move.l    d3,d6            ; Swap 1x2, part 2
  234.         lsr.l    #1,d6
  235.         eor.l    d1,d6
  236.         and.l    d4,d6
  237.         eor.l    d6,d1
  238.         add.l    d6,d6
  239.         eor.l    d6,d3
  240.  
  241.         cmp.l    a0,a2
  242.         bne        .x
  243. .x2
  244.         move.l    d1,(a1)+
  245.         move.l    d2,(a1)+
  246.         move.l    d3,(a1)+
  247.  
  248.         lea    (c2p_bltnode,pc),a1
  249.         move.l    #c2p1x1_cpu3blit1_queue_41,(c2p_bltroutptr-c2p_bltnode,a1)
  250.         movea.l    (_GfxBase),a6
  251.         jsr    (_LVOQBlit,a6)
  252.  
  253. .none
  254.         movem.l (sp)+,d2-d7/a2-a6
  255.         rts
  256.  
  257. ;-----------------------------------------------------------------------
  258. c2p1x1_cpu3blit1_queue_41            ; Pass 4, subpass 1, ascending
  259.         move.w    #-1,(bltafwm,a0)
  260.         move.w    #-1,(bltalwm,a0)
  261.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  262.         add.l    #12,d0
  263.         move.l    d0,(bltapt,a0)
  264.         addq.l    #2,d0
  265.         move.l    d0,(bltbpt,a0)
  266.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  267.         add.l    d0,d0
  268.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  269.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  270.         move.l    d0,(bltdpt,a0)
  271.         move.w    #14,(bltamod,a0)
  272.         move.w    #14,(bltbmod,a0)
  273.         move.w    #0,(bltdmod,a0)
  274.         move.w    #$cccc,(bltcdat,a0)
  275.         move.w    #$0de4,(bltcon0,a0)
  276.         move.w    #$2000,(bltcon1,a0)
  277.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  278.         move.w    #1,(bltsizh,a0)
  279.         move.l    #c2p1x1_cpu3blit1_queue_42,(c2p_bltroutptr-c2p_bltnode,a1)
  280.         rts
  281.  
  282. ;-----------------------------------------------------------------------
  283. c2p1x1_cpu3blit1_queue_42            ; Pass 4, subpass 2, ascending
  284.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  285.         addq.l    #8,d0
  286.         move.l    d0,(bltapt,a0)
  287.         addq.l    #2,d0
  288.         move.l    d0,(bltbpt,a0)
  289.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  290.         add.l    d0,d0
  291.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  292.         add.l    d0,d0
  293.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  294.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  295.         move.l    d0,(bltdpt,a0)
  296.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  297.         move.w    #1,(bltsizh,a0)
  298.         move.l    #c2p1x1_cpu3blit1_queue_43,(c2p_bltroutptr-c2p_bltnode,a1)
  299.         rts
  300.  
  301. ;-----------------------------------------------------------------------
  302. c2p1x1_cpu3blit1_queue_43            ; Pass 4, subpass 3, ascending
  303.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  304.         addq.l    #4,d0
  305.         move.l    d0,(bltapt,a0)
  306.         addq.l    #2,d0
  307.         move.l    d0,(bltbpt,a0)
  308.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  309.         add.l    d0,d0
  310.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  311.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  312.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  313.         move.l    d0,(bltdpt,a0)
  314.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  315.         move.w    #1,(bltsizh,a0)
  316.         move.l    #c2p1x1_cpu3blit1_queue_44,(c2p_bltroutptr-c2p_bltnode,a1)
  317.         rts
  318.  
  319. ;-----------------------------------------------------------------------
  320. c2p1x1_cpu3blit1_queue_44            ; Pass 4, subpass 4, ascending
  321.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  322.         move.l    d0,(bltapt,a0)
  323.         addq.l    #2,d0
  324.         move.l    d0,(bltbpt,a0)
  325.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  326.         lsl.l    #3,d0
  327.         sub.l    (c2p_bplsize-c2p_bltnode,a1),d0
  328.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  329.         add.l    (c2p_scroffs-c2p_bltnode,a1),d0
  330.         move.l    d0,(bltdpt,a0)
  331.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  332.         move.w    #1,(bltsizh,a0)
  333.         move.l    #c2p1x1_cpu3blit1_queue_45,(c2p_bltroutptr-c2p_bltnode,a1)
  334.         rts
  335.  
  336. ;-----------------------------------------------------------------------
  337. c2p1x1_cpu3blit1_queue_45            ; Pass 4, subpass 5, descending
  338.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  339.         subq.l    #4,d0
  340.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  341.         move.l    d0,(bltapt,a0)
  342.         addq.l    #2,d0
  343.         move.l    d0,(bltbpt,a0)
  344.         move.l    (c2p_screen-c2p_bltnode,a1),d0
  345.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  346.         move.l    d0,(bltdpt,a0)
  347.         move.w    #$2de4,bltcon0(a0)
  348.         move.w    #$0002,bltcon1(a0)
  349.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  350.         move.w    #1,(bltsizh,a0)
  351.         move.l    #c2p1x1_cpu3blit1_queue_46,(c2p_bltroutptr-c2p_bltnode,a1)
  352.         rts
  353.  
  354. ;-----------------------------------------------------------------------
  355. c2p1x1_cpu3blit1_queue_46            ; Pass 4, subpass 6, descending
  356.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  357.         subq.l    #8,d0
  358.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  359.         move.l    d0,(bltapt,a0)
  360.         addq.l    #2,d0
  361.         move.l    d0,(bltbpt,a0)
  362.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  363.         lsl.l    #2,d0
  364.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  365.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  366.         move.l    d0,(bltdpt,a0)
  367.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  368.         move.w    #1,(bltsizh,a0)
  369.         move.l    #c2p1x1_cpu3blit1_queue_47,(c2p_bltroutptr-c2p_bltnode,a1)
  370.         rts
  371.  
  372. ;-----------------------------------------------------------------------
  373. c2p1x1_cpu3blit1_queue_47            ; Pass 4, subpass 7, descending
  374.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  375.         sub.l    #12,d0
  376.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  377.         move.l    d0,(bltapt,a0)
  378.         addq.l    #2,d0
  379.         move.l    d0,(bltbpt,a0)
  380.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  381.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  382.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  383.         move.l    d0,(bltdpt,a0)
  384.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  385.         move.w    #1,(bltsizh,a0)
  386.         move.l    #c2p1x1_cpu3blit1_queue_48,(c2p_bltroutptr-c2p_bltnode,a1)
  387.         rts
  388.  
  389. ;-----------------------------------------------------------------------
  390. c2p1x1_cpu3blit1_queue_48            ; Pass 4, subpass 8, descending
  391.         move.l    (c2p_blitbuf-c2p_bltnode,a1),d0
  392.         sub.l    #16,d0
  393.         add.l    (c2p_pixels-c2p_bltnode,a1),d0
  394.         move.l    d0,(bltapt,a0)
  395.         addq.l    #2,d0
  396.         move.l    d0,(bltbpt,a0)
  397.         move.l    (c2p_bplsize-c2p_bltnode,a1),d0
  398.         lsl.l    #2,d0
  399.         add.l    (c2p_bplsize-c2p_bltnode,a1),d0
  400.         add.l    (c2p_screen-c2p_bltnode,a1),d0
  401.         add.l    (c2p_scroffs2-c2p_bltnode,a1),d0
  402.         move.l    d0,(bltdpt,a0)
  403.         move.w    (c2p_pixels16+2-c2p_bltnode,a1),(bltsizv,a0)
  404.         move.w    #1,(bltsizh,a0)
  405.         moveq    #0,d0
  406.         rts
  407.  
  408. ;-----------------------------------------------------------------------
  409. c2p_blitcleanup
  410.         movem.l    a2/a6,-(sp)
  411.         lea    (c2p_bltnode,pc),a2
  412.         move.l    (task-c2p_bltnode,a2),a1 ; signal QBlit() has finished
  413.         move.l    (signals1-c2p_bltnode,a2),d0
  414.         move.l    (4).w,a6
  415.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  416.         move.l    (othertask-c2p_bltnode,a2),a1
  417.         move.l    (signals3-c2p_bltnode,a2),d0
  418.         jsr    (_LVOSignal,a6)        ; signal pass 4 has finished
  419.         movem.l    (sp)+,a2/a6
  420.         rts
  421.  
  422. ;-----------------------------------------------------------------------
  423.         cnop 0,4
  424. c2p_bltnode
  425.         dc.l    0
  426. c2p_bltroutptr
  427.         dc.l    0
  428.         dc.b    $40,0
  429.         dc.l    0
  430. c2p_bltroutcleanup
  431.         dc.l     c2p_blitcleanup
  432.  
  433. task        dc.l    0    ; ptr to task to Signal(signals1) on cleanup()
  434. othertask    dc.l    0    ; ptr to task to Signal(signals3) on cleanup()
  435. signals1    dc.l    0    ; signals to Signal() this task at cleanup
  436. signals3    dc.l    0    ; signals to Signal() othertask at cleanup
  437.  
  438.         cnop    0,4
  439.  
  440. c2p_data
  441. c2p_screen    dc.l    0
  442. c2p_scroffs    dc.l    0
  443. c2p_scroffs2    dc.l    0
  444. c2p_bplsize    dc.l    0
  445. c2p_pixels    dc.l    0
  446. c2p_pixels16    dc.l    0
  447. c2p_blitbuf    dc.l    0
  448. c2p_chunkyy    dc.w    0
  449.  
  450. ;-----------------------------------------------------------------------
  451. ;        section bss_c,bss_c,chip
  452. ;
  453. ;c2p_blitbuf
  454. ;        ds.b     CHUNKYXMAX*CHUNKYYMAX
  455.  
  456. ;-----------------------------------------------------------------------
  457.  
  458.         end
  459.